#include <iostream>
#include <string.h>
using namespace std;

class String{
public:
    String()
    :_pstr(new char[1])
    {
        cout<<"string()"<<endl;
    }
    String(const char* pstr)
    :_pstr(new char[strlen(pstr)+1])
    {
        cout<<"String(const char* pstr)"<<endl;
        strcpy(_pstr,pstr);
    }
    //移动构造函数
    String(String && rhs)
    :_pstr(rhs._pstr)
    {
        cout<<"String(String && rhs)"<<endl;
        rhs._pstr=nullptr;
    }
    String(const String &rhs)
    :_pstr(new char[ strlen(rhs._pstr)]+1)
    {
        strcpy(_pstr,rhs._pstr);
    }
    String & operator=(const String & rhs){
        cout<<"string & operator=(const string &)"<<endl;
        if(this!=&rhs){
            delete [] _pstr;
            _pstr=new char[strlen(rhs._pstr)+1]();
            strcpy(_pstr,rhs._pstr);
        }
        return *this;
    }
    size_t length()const{
        size_t len=0;
        if(_pstr){
            len=strlen(_pstr);
        }
        return len;
    }
    const char* c_str()const{
        if(_pstr){
            return _pstr;
        }
        return nullptr;
    }
    ~String(){
        if(_pstr){
            delete[] _pstr;
            _pstr=nullptr;
        }
    }
    void print()const{
        if(_pstr){
            cout<<_pstr<<endl;
        }else{
            cout<<endl;
        }
    }
private:
    char * _pstr;
};
void test(){
    String s1("hello");
    
        
}
void test2(){
    //const引用可以绑定左值，也可以绑定右值
    int a=10;
    const int & r3=1;
    const int & r4=a;
    
    //非const引用只能绑定左
    //值，不能绑定右值
    int && r_ref=10;
//    int && r_ref2=a;
}
    
void test3(){
    //而过能分辨出左值引用还是右值引用，
    //那么就可以定义移动构造函数
    

}
void test4(){
    String s1("hello");
}
int main(int argc, char * argv[]){
    test4();
    return 0;
}

